unit CaixaVendasDM;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ZDataset, MainDM, DB;

type

  { TCaixaVendaData }

  TCaixaVendaData = class(TMainDataModule)
    CaixaDatasource: TDatasource;
    CaixaZQuery: TZQuery;
    CaixaZQuerydata_fim: TDateTimeField;
    CaixaZQuerydata_inicio: TDateTimeField;
    CaixaZQueryhora_fim: TTimeField;
    CaixaZQueryhora_inicio: TTimeField;
    CaixaZQueryid_caixa: TLargeintField;
    CaixaZQueryid_usuario: TLargeintField;
    CaixaZQueryvalor_acrescentado: TFloatField;
    CaixaZQueryvalor_final: TFloatField;
    CaixaZQueryvalor_inicial: TFloatField;
    CaixaZQueryvalor_retirado: TFloatField;
    AuxiliarZQuery: TZQuery;
    VendaDatasource: TDatasource;
    VendaZQuery: TZQuery;
    VendaZQuerydata: TDateField;
    VendaZQuerydesconto: TFloatField;
    VendaZQueryhora: TTimeField;
    VendaZQueryid_cliente: TLargeintField;
    VendaZQueryid_condicao_pagamento: TLargeintField;
    VendaZQueryid_usuario: TLargeintField;
    VendaZQueryid_venda: TLargeintField;
    VendaZQuerynome_pessoa: TStringField;
    VendaZQuerysigla_forma_pagamento: TStringField;
    VendaZQueryvalor: TFloatField;
    VendaZQueryvalor_total: TFloatField;
    procedure DataModuleCreate(Sender: TObject);
    /// Abre o DataSet
    procedure OpenDataSet(); override;
    /// Fecha o DataSet
    procedure CloseDataSet(); override;
    /// Realiza busca
    /// @param(Condicoes são as condições para a busca)
    /// @param(Tabela é a tabela no banco de dados)
    // procedure Search(Condicoes: TQueryConditions; Tabela: string); override;
    function BuscaTrocoAnterior(): real;
    function BuscaTroco(IDCaixa: string): real;
    function VerificaCaixaAberto(): boolean;
    function BuscaTotalSaidaCaixa(IDCaixa: string): real;
    function BuscaTotalEntradaCaixa(IDCaixa: string): real;
    function BuscaTotalVendas(IDCaixa: string): real;
    function BuscaValorAcrescentado(IDCaixa: string): real;
    function BuscaIDCaixa(): string;
    procedure BuscaVendas(IDCaixa: string);
    function BuscaValorTotal(): string;
    procedure BuscaDadosCaixa(IDCaixa: string);
    function BuscaDataInicial(IDCaixa: string): string;

  end;

var
  CaixaVendaData: TCaixaVendaData;

implementation

uses ConnectionDM;

{ TCaixaVendaData }

procedure TCaixaVendaData.DataModuleCreate(Sender: TObject);
begin
  MainDataSet := CaixaZQuery;
end;

procedure TCaixaVendaData.OpenDataSet;
var
  IDCaixa: string;
  Data: string;
begin
  ConnectionData.EmptyQuery(CaixaZQuery, 'caixa');
  CaixaZQuery.Open;
  IDCaixa := BuscaIDCaixa();
  if IDCaixa <> '' then begin
    BuscaVendas(IDCaixa);
    Data := BuscaDataInicial(IDCaixa);
    CaixaZQuery.Edit();
    CaixaZQuery.FieldByName('valor_final').AsString := BuscaValorTotal();
    CaixaZQuery.FieldByName('data_inicio').AsString := Data;
  end;
end;

procedure TCaixaVendaData.CloseDataSet;
begin
  CaixaZQuery.Cancel();
  VendaZQuery.Close();
  CaixaZQuery.Close();
end;

function TCaixaVendaData.BuscaTrocoAnterior: real;
var
  Troco: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select (valor_final - valor_retirado) as troco');
    SQL.Add('FROM caixa');
    SQL.Add('where id_caixa = (select max(id_caixa) from caixa)');
    Open();
    Troco := FieldByName('troco').AsString;
    if (Troco <> '') then begin
      Result := StrToFloat(Troco);
    end else begin
      Result := 0;
    end;
  end;
end;

function TCaixaVendaData.BuscaTroco(IDCaixa: string): real;
var
  Troco: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select (valor_final - valor_retirado) as troco');
    SQL.Add('FROM caixa');
    SQL.Add('where id_caixa =:id_caixa -1');
    ParamByName('id_caixa').AsString := IDCaixa;
    Open();
    Troco := FieldByName('troco').AsString;
    if (Troco <> '') then begin
      Result := StrToFloat(Troco);
    end else begin
      Result := 0;
    end;
  end;
end;

function TCaixaVendaData.VerificaCaixaAberto(): boolean;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select id_caixa');
    SQL.Add('FROM caixa');
    SQL.Add('where data_fim =:date');
    ParamByName('date').AsString := '2000-01-01';
    Open();
    if (RecordCount > 0) then begin
      Result := True;
    end else begin
      Result := False;
    end;
  end;
end;

//Função que vai Buscar a soma dos Valores da Saída do Caixa
function TCaixaVendaData.BuscaTotalSaidaCaixa(IDCaixa: string): real;
var
  vale: real;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select sum(esc.valor)as vale From entrada_saida_caixa as esc');
    SQL.Add('where id_caixa =:id_caixa AND tipo=:tipo');
    ParamByName('id_caixa').AsString := IDCaixa;
    ParamByName('tipo').AsString := 'S';
    Open();
    Edit();
    if RecordCount > 0 then begin
      vale := FieldByName('vale').AsFloat;
      Result := vale;
    end else begin
      Result := 0;
    end;
  end;
end;

//Função que vai Buscar a soma dos Valores da Saída do Caixa
function TCaixaVendaData.BuscaTotalEntradaCaixa(IDCaixa: string): real;
var
  entrada: real;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select sum(esc.valor)as entrada From entrada_saida_caixa as esc');
    SQL.Add('where id_caixa =:id_caixa AND tipo=:tipo');
    ParamByName('id_caixa').AsString := IDCaixa;
    ParamByName('tipo').AsString := 'E';
    Open();
    Edit();
    if RecordCount > 0 then begin
      entrada := FieldByName('entrada').AsFloat;
      Result := entrada;
    end else begin
      Result := 0;
    end;
  end;
end;

function TCaixaVendaData.BuscaTotalVendas(IDCaixa: string): real;
var
  Dinheiro: real;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select sum(cv.valor) as valor From caixa_venda as cv');
    SQL.Add('where cv.id_caixa =:id_caixa AND cv.sigla_forma_pagamento<>:prazo');
    ParamByName('id_caixa').AsString := IDCaixa;
    ParamByName('prazo').AsString := 'P';
    Open();
    if RecordCount > 0 then begin
      Dinheiro := FieldByName('valor').AsFloat;
      Result := Dinheiro;
    end else begin
      Result := 0;
    end;
  end;
end;

function TCaixaVendaData.BuscaValorAcrescentado(IDCaixa: string): real;
var
  Dinheiro: real;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select valor_acrescentado From caixa as c');
    SQL.Add('where c.id_caixa =:id_caixa');
    ParamByName('id_caixa').AsString := IDCaixa;
    Open();
    if RecordCount > 0 then begin
      Dinheiro := FieldByName('valor_acrescentado').AsFloat;
      Result := Dinheiro;
    end else begin
      Result := 0;
    end;
  end;

end;

function TCaixaVendaData.BuscaIDCaixa(): string;
var
  IDCaixa: string;
begin
  with CaixaZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select id_caixa from caixa where data_fim =:date');
    ParamByName('date').AsString := '2000-01-01';
    Open();
    Edit();
    if RecordCount > 0 then begin
      IDCaixa := FieldByName('id_caixa').AsString;
      Result := IDCaixa;
    end else begin
      Result := '';
    end;
  end;
end;

procedure TCaixaVendaData.BuscaVendas(IDCaixa: string);
begin
  with VendaZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select p.nome_pessoa, v.* from venda as v, caixa_venda as cv, pessoa as p');
    SQL.Add('where cv.id_caixa=:id_caixa AND v.id_venda = cv.id_venda AND v.id_cliente=p.id_pessoa');
    ParamByName('id_caixa').AsString := IDCaixa;
    Open();
  end;
end;

function TCaixaVendaData.BuscaValorTotal(): string;
var
  TotalEntrada, TotalSaida, TotalVenda, Troco, ValorAcrescentado: real;
  IDCaixa, Total: string;
begin
  IDCaixa := BuscaIDCaixa();
  if IDCaixa <> '' then begin
    TotalVenda := BuscaTotalVendas(IDCaixa);
    Troco := BuscaTroco(IDCaixa);
    TotalEntrada := BuscaTotalEntradaCaixa(IDCaixa);
    TotalSaida := BuscaTotalSaidaCaixa(IDCaixa);
    ValorAcrescentado := BuscaValorAcrescentado(IDCaixa);
    Total := FloatToStr((Troco + ValorAcrescentado + TotalVenda + TotalEntrada) -
      TotalSaida);
    Result := Total;
  end else begin
    Result := '';
  end;
end;

procedure TCaixaVendaData.BuscaDadosCaixa(IDCaixa: string);
begin
  with CaixaZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select * from caixa');
    SQL.Add('where id_caixa=:id_caixa');
    ParamByName('id_caixa').AsString := IDCaixa;
    Open();
  end;
end;

function TCaixaVendaData.BuscaDataInicial(IDCaixa: string): string;
begin
  with CaixaZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select data_inicio from caixa');
    SQL.Add('where id_caixa=:id_caixa');
    ParamByName('id_caixa').AsString := IDCaixa;
    Open();
    Result := CaixaZQuery.FieldByName('data_inicio').AsString;
  end;
end;

initialization
  {$I caixavendasdm.lrs}

end.
